//给你一个下标从 1 开始的整数数组 numbers ，该数组已按 非递减顺序排列 ，请你从数组中找出满足相加之和等于目标数 target 的两个数。如果设这
//两个数分别是 numbers[index1] 和 numbers[index2] ，则 1 <= index1 < index2 <= numbers.
//length 。 
//
// 以长度为 2 的整数数组 [index1, index2] 的形式返回这两个整数的下标 index1 和 index2。 
//
// 你可以假设每个输入 只对应唯一的答案 ，而且你 不可以 重复使用相同的元素。 
//
// 你所设计的解决方案必须只使用常量级的额外空间。 
//
// 示例 1： 
//
// 
//输入：numbers = [2,7,11,15], target = 9
//输出：[1,2]
//解释：2 与 7 之和等于目标数 9 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。 
//
// 示例 2： 
//
// 
//输入：numbers = [2,3,4], target = 6
//输出：[1,3]
//解释：2 与 4 之和等于目标数 6 。因此 index1 = 1, index2 = 3 。返回 [1, 3] 。 
//
// 示例 3： 
//
// 
//输入：numbers = [-1,0], target = -1
//输出：[1,2]
//解释：-1 与 0 之和等于目标数 -1 。因此 index1 = 1, index2 = 2 。返回 [1, 2] 。
// 
//
// 
//
// 提示： 
//
// 
// 2 <= numbers.length <= 3 * 10⁴ 
// -1000 <= numbers[i] <= 1000 
// numbers 按 非递减顺序 排列 
// -1000 <= target <= 1000 
// 仅存在一个有效答案 
// 
//
// Related Topics 数组 双指针 二分查找 👍 967 👎 0

package leetcode.editor.cn;

import java.util.Arrays;

//java:两数之和 II - 输入有序数组
public class Q0167TwoSumIiInputArrayIsSorted {
    public static void main(String[] args){
//        Solution solution = new Q0167TwoSumIiInputArrayIsSorted().new Solution();
        int[] numbers = {2, 3, 4};
        int[] res = new Q0167TwoSumIiInputArrayIsSorted().new Solution().twoSum(numbers, 6);
        System.out.println(Arrays.toString(res));
    }
    //leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int[] twoSum(int[] numbers, int target) {
        if (numbers.length < 2 || numbers.length > 30000) return null;
//        for (int i = 0; i < numbers.length; i++) {
//            for (int j = i + 1; j < numbers.length; j++) {
//                if (target - numbers[i] == numbers[j]) {
//                    res[0] = i + 1;
//                    res[1] = j + 1;
//                    return res;
//                }
//            }
//        }
        // 递增 二分法 O(nlogn)
//        for (int i = 0; i < numbers.length; i++) {
//            int left = i + 1, right = numbers.length - 1, middle;
//            while (left <= right) {
//                middle = (right - left) / 2 + left;
//                if (numbers[middle] == target - numbers[i]) {
//                    res[0] = i + 1;
//                    res[1] = middle + 1;
//                    return res;
//                } else if (numbers[middle] < target - numbers[i]) {
//                    left = middle + 1;
//                } else {
//                    right = middle - 1;
//                }
//            }
//        }
//        return res;
        int[] res = new int[2];
        int low = 0, high = numbers.length - 1;
        while (low <= high) {
            if (numbers[low] + numbers[high] == target) {
                res[0] = low + 1;
                res[1] = high + 1;
                return res;
            } else if (numbers[low] + numbers[high] < target) {
                low++;
            } else {
                high--;
            }
        }
        return res;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

}